/*
 * @Description: 
 * @Author: Aroma
 * @Date: 2024-09-24 20:06:56
 * @LastEditors: Aroma
 * @LastEditTime: 2024-09-24 20:24:19
 * @别瞎看: 你个无脑牛马
 */
public class Test7_1_1{
    public static void main(String[] args) {
        String str1="hello";
        String str2="hello";
        // str1 和 str2 都指向字符串常量池中的同一个 "hello" 对象。
        String str3=new String("hello");
        String str4=new String("hello");
        // str3 和 str4 通过 new 关键字分别创建了新的 String 对象，尽管它们的内容相同，但它们在内存中位于不同的位置。
        String str5="hellohello";
        // str5 指向字符串常量池中的 "hellohello" 对象。
        String str6=str1 + str2;
        // 这里发生了字符串连接，即使 str1 和 str2 指向同一个对象，"hello" + "hello" 会创建一个新的字符串对象 "hellohello"，
        // 并且这个对象被存储在堆上，而不是字符串常量池中（除非JVM进行了优化，但通常不会对于非编译时常量表达式）。
        System.out.println(str1==str2); // 输出 true，因为 str1 和 str2 指向同一个对象。
        System.out.println(str2==str3); // 输出 false，因为 str2 指向字符串常量池中的对象，而 str3 是新创建的对象。
        System.out.println(str3==str4); // 输出 false，因为 str3 和 str4 是两个不同的对象。
        System.out.println(str2.equals(str3)); // 输出 true，因为 str2 和 str3 包含相同的字符序列。
        System.out.println(str3.equals(str4)); // 输出 true，同理。
        System.out.println(str5.equals(str6)); // 输出 true，因为 str5 和 str6 包含相同的字符序列。
        System.out.println(str5==str6); // 输出 false，因为 str5 指向字符串常量池中的对象，而 str6 是新创建的对象。
    }
}